package com.loop.netty.codec2;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

/**
 * 自定义一个Handler，需要继承ChannelInboundHandlerAdapter（netty规定）
 *
 * @author zhangxiaolu
 * @since 2023-09-10 22:11
 */
public class NettyServerHandler extends SimpleChannelInboundHandler<MyDataInfoBuf.MyDataInfo> {

    // 读取数据事件（这里我们可以读取客户端发送的消息）

    @Override
    public void channelRead0(ChannelHandlerContext ctx, MyDataInfoBuf.MyDataInfo msg) throws Exception {
        // 根据DataType 来显示不同的信息
        if (msg.getDateType() == MyDataInfoBuf.MyDataInfo.DateType.BossType) {
            System.out.println("boss id：" + msg.getBoss().getId() + " name：" + msg.getBoss().getName());
        } else if (msg.getDateType() == MyDataInfoBuf.MyDataInfo.DateType.BossType) {
            System.out.println("worker name：" + msg.getWorker().getName() + " age：" + msg.getWorker().getAge());
        } else {
            System.out.println("类型错误");
        }
    }

    // 数据读取完毕事件
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // write和flush方法的合并，将数据写入到缓存，并刷新
        // 刷新是必须的，否则数据不会被写入到Socket通道
        // 刷新之后，数据才能发送到客户端
        // 一般讲，我们对这个发送的数据进行编码
        System.out.println("NettyServerHandler.channelReadComplete()");
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端~2", CharsetUtil.UTF_8));

    }

    // 出现异常事件
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("NettyServerHandler.exceptionCaught()");
        ctx.close();
    }
}
